home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / PRGCTRL.D < prev    next >
Encoding:
Modula Definition  |  1990-12-11  |  6.6 KB  |  170 lines

  1. DEFINITION MODULE PrgCtrl;
  2.  
  3. (*
  4.  * Dies Modul dient zur Kontrolle von programm-/prozeßbedingten Ereignissen:
  5.  *  - Prozeßbeendigung (TermProcess)
  6.  *  - Abfangen einer Prozeßbeendigung (CatchProcessTerm)
  7.  *  - Abfangen von neuen Prozeßstarts und deren Beendigungen (SetEnvelope)
  8.  *  - Ermitteln der 'Base Page' eines Prozesses (GetBasePageAddr)
  9.  *  - Erkennung, ob das Programm als Accessory gestartet wurde (Accessory).
  10.  *)
  11.  
  12. FROM SYSTEM IMPORT LONGWORD, WORD, ADDRESS;
  13.  
  14. FROM MOSGlobals IMPORT MemArea;
  15.  
  16.  
  17. TYPE    PState = ( created,   (* Angelegt, aber noch nicht laufend. *)
  18.                    opening,   (* Prozeß aktiv in Initialisierung. *)
  19.                    running,   (* Prozeß aktiv im Hauptprogramm. *)
  20.                    closing,   (* Prozeß aktiv in Deinitialisierung. *)
  21.                    finished );(* Prozeß beendet. *)
  22.  
  23.  
  24. PROCEDURE TermProcess ( exitCode: INTEGER );
  25.   (*
  26.    * Abbruch eines Prozesses. Wenn ein Modul mittels "SetChain" (im
  27.    * Modul "Loader") als Nachfolger bestimmt wurde, wird dieses gestartet.
  28.    * Ansonsten erfolgt Rückkehr zum aufrufenden Modul / Programm.
  29.    *)
  30.  
  31.  
  32. TYPE TermCarrier = ARRAY [0..9] OF WORD;
  33.  
  34. PROCEDURE CatchProcessTerm ( VAR hdl: TermCarrier; call: PROC; wsp: MemArea );
  35.   (*
  36.    * Ermöglicht das Anmelden von Prozeduren, die aufgerufen werden,
  37.    * wenn der zum Zeitpunkt der Anmeldung aktive Prozeß beendet wird.
  38.    *
  39.    * Achtung: Diese Funktion eignet sich nicht für die Verwendung in Imple-
  40.    * mentations-Moduln, die 'Sys'-Funktionen verwenden oder "Systemvektoren"
  41.    * verändern - in solchen Fällen muß die Funktion 'CatchRemoval' aus
  42.    * 'ResCtrl' verwendet werden (siehe auch Anmerkungenin betreffendem Def-
  43.    * Text)! 'CatchProcessTerm' sollte nur im Hauptmodul oder in Fällen, in
  44.    * denen wirklich das Prozeßende erwartet wird, verwendet werden!
  45.    * Siehe auch Beispielprogramm 'SysLibDemo.M' im UTILITY-Ordner.
  46.    *
  47.    * Der Funktion 'call' wird beim Aufruf 'wsp' als Stack zugeteilt.
  48.    * Wenn 'wsp.bottom' = NIL ist, wird der Stack des beendeten Prozesses
  49.    * verwendet, was in der Regel empfohlen werden kann.
  50.    *
  51.    * Die angemeldeten Prozeduren werden automatisch nach ihrem Aufruf
  52.    * abgemeldet.
  53.    *
  54.    * 'hdl' darf keine lokale Variable sein, sie muß so lange erhalten
  55.    * bleiben, bis 'call' aufgerufen wurde !
  56.    *
  57.    * Es ist darauf zu achten, daß diese Funktion nur einmal pro anzumeldende
  58.    * 'call'-Prozedur aufgerufen wird.
  59.    *
  60.    * Für diese Funktion wird der 'etv_term'-Systemvektor benutzt, dabei
  61.    * wird die XBRA-Kennung 'MM2T' verwendet.
  62.    *)
  63.  
  64.  
  65. TYPE EnvlpCarrier = ARRAY [0..15] OF WORD;
  66.      EnvlpProc = PROCEDURE (    (* opening: *) BOOLEAN,
  67.                                 (* inChild: *) BOOLEAN,
  68.                             VAR (* exitCode:*) INTEGER );
  69.  
  70. PROCEDURE SetEnvelope ( VAR hdl: EnvlpCarrier; call: EnvlpProc; wsp: MemArea );
  71.   (*
  72.    * Hiermit können Funktionen angemeldet werden, die jeweils bei Start
  73.    * und Beendigung eines neuen Prozesses aufgerufen werden.
  74.    *
  75.    * Der Funktion 'call' wird beim Aufruf 'wsp' als Stack zugeteilt.
  76.    * Wenn 'wsp.bottom' = NIL ist, wird der Stack des beendeten Prozesses
  77.    * verwendet (ist in der Regel empfehlenswert).
  78.    *
  79.    * 'call' wird für einen neuen Prozeß viermal aufgerufen. Die beiden
  80.    * Parameter geben den Aufrufzeitpunkt an, die Funktion kann dann bei
  81.    * den beiden Aufrufen mit 'inChild'=FALSE (s.u.) jeweils einen Fehler-
  82.    * code (s. MOSGlobals) in 'exitCode' liefern, wenn ein Fehler aufgetre-
  83.    * ten ist. Bei 'inChild'=TRUE kann der Prozeß auch direkt mit einem
  84.    * Laufzeitfehler beendet werden.
  85.    * Je ein Aufruf erfolgt vor Einrichtung ('opening' = TRUE) und nach
  86.    * Entfernung ('opening' = FALSE) des neuen Prozesses ('inChild' ist
  87.    * dabei immer FALSE). Tritt beim ersten Aufruf kein Fehler auf, er-
  88.    * folgen zwei Aufrufe direkt nach Einrichtung ('opening' = TRUE) und
  89.    * vor Entfernung ('opening' = FALSE) des neuen Prozesses ('inChild'
  90.    * ist dabei immer TRUE).
  91.    *
  92.    * Die Funktion 'call' kann mit der Prozedur "RemoveEnvelope" abgemeldet
  93.    * werden.
  94.    *
  95.    * 'hdl' darf keine lokale Variable sein, sie muß so lange erhalten
  96.    * bleiben, wie die Funktion 'call' angemeldet ist.
  97.    *
  98.    * Es ist darauf zu achten, daß diese Funktion nur einmal pro anzumeldende
  99.    * 'call'-Prozedur aufgerufen wird.
  100.    *
  101.    * WICHTIG: Das benutzende Modul muß mit der Directive "$Y+" übersetzt
  102.    *          werden!
  103.    *)
  104.  
  105. PROCEDURE SysSetEnvelope (VAR hdl: EnvlpCarrier; call: EnvlpProc; wsp: MemArea);
  106.   (*
  107.    * Siehe Anm. zu 'Sys'-Funktionen im Handbuch
  108.    *)
  109.  
  110. PROCEDURE RemoveEnvelope ( VAR hdl: EnvlpCarrier );
  111.   (*
  112.    * Meldet das Funktionenpaar, das vorher mit "SetEnvelope" angemeldet
  113.    * war, wieder ab.
  114.    *)
  115.  
  116. PROCEDURE GetBasePageAddr ( VAR bpp: ADDRESS );
  117.   (*
  118.    * Liefert die Adresse der Base-Page vom aktuellen Programm
  119.    * (auch bei Accessories).
  120.    * Vorsicht bei residenten Programmen: Hier muß, wenn die Base-Page
  121.    * vom eigenen Programm ermittelt werden soll, diese Funktion
  122.    * aufgerufen werden, bevor sich das Programm resident gemacht
  123.    * und sich beendet hat!
  124.    *)
  125.  
  126. PROCEDURE Accessory (): BOOLEAN;
  127.   (*
  128.    * Liefert TRUE, wenn das Programm als Accessory gestartet wurde.
  129.    *)
  130.  
  131. PROCEDURE ActiveProcess (): ADDRESS;
  132.   (*
  133.    * Liefert die Adresse der 'base page' des gerade aktiven Prozesses
  134.    * (eines mit 'Pexec' oder 'Loader.CallModule' gestarteten Programms
  135.    * oder Moduls).
  136.    * Bei Accessories wird dann hier nicht die Basepage des ACCs, sondern
  137.    * die des laufenden Hauptprogramms geliefert.
  138.    *)
  139.  
  140. PROCEDURE BaseProcess (): ADDRESS;
  141.   (*
  142.    * Liefert immer die 'base page' des untersten, gelinkten Prozesses.
  143.    * Dies geht auch bei Accessories und residenten Programmen.
  144.    *)
  145.  
  146. PROCEDURE ProcessLinked (): BOOLEAN;
  147.   (*
  148.    * Liefert TRUE, wenn der aktive Prozeß der unterste, gelinkte ist.
  149.    * Bei Accessories und residenten Programmen wird ebenfalls TRUE geliefert.
  150.    *)
  151.  
  152. PROCEDURE ProcessState (): PState;
  153.   (*
  154.    * Liefert den augenblicklichen Status des laufenden Prozesses.
  155.    *)
  156.  
  157. PROCEDURE CurrentExitCode (): INTEGER;
  158. PROCEDURE SetNewExitCode ( i: INTEGER );
  159.   (*
  160.    * Die Funktionen sind gedacht, um während der Terminierungsphase eines
  161.    * Programm den ExitCode nachträglich zu ändern (so, wie es beim
  162.    * Envelope-Handler direkt durch Ändern der übergebenen 'exitCode'-Variablen
  163.    * möglich ist). Deshalb können diese Funktionen nur aufgerufen werden,
  164.    * solange 'ProcessState () = closing' ist.
  165.    * 'CurrentExitCode' liefert den bisherigen ExitCode,
  166.    * 'SetNewExitCode' weist ihm einen neuen Wert zu.
  167.    *)
  168.  
  169. END PrgCtrl.
  170.